Loops - (Until, Loop Control va Advanced)
Until Loops
Nazariya
Until tsikli while tsiklining teskarisi - shart false bo'lgunga qadar ishlaydi. Bu ba'zi vaziyatlarda mantiqiy jihatdan aniqroq bo'ladi.
Until vs While:
while [ condition ]- shart true bo'lgunga qadaruntil [ condition ]- shart true bo'lgunga qadar KUTISH
Amaliyot
#!/bin/bash
echo "============================================"
echo " UNTIL LOOPS DEMO"
echo "============================================"
# 1. BASIC UNTIL LOOPS
echo "=== 1. Asosiy Until Tsikllar ==="
# Simple countdown
echo "Oddiy countdown (until bilan):"
counter=5
echo " Countdown:"
until [ $counter -eq 0 ]; do
echo " $counter"
((counter--))
sleep 1
done
echo " 🚀 Launch!"
echo
# Wait for user input
echo "Foydalanuvchi inputini kutish:"
user_ready=false
attempts=0
until [ "$user_ready" = true ] || [ $attempts -ge 3 ]; do
((attempts++))
read -p " Tayyor bo'lganingizda 'yes' yozing (urinish $attempts/3): " response
if [ "$response" = "yes" ]; then
user_ready=true
echo " ✅ Tayyor!"
else
echo " ⏳ Kutilmoqda..."
fi
done
if [ "$user_ready" = false ]; then
echo " ⚠️ Maksimal urinishlar tugadi!"
fi
echo
# Resource availability check
echo "Resurs mavjudligini kutish (simulatsiya):"
resource_available=false
check_count=0
until [ "$resource_available" = true ] || [ $check_count -ge 3 ]; do
((check_count++))
echo " 🔍 Tekshiruv #$check_count..."
# Simulate random availability (60% chance)
if [ $((RANDOM % 10)) -gt 3 ]; then
resource_available=true
echo " ✅ Resurs mavjud!"
else
echo " ❌ Resurs hali mavjud emas, 1 soniya kutilmoqda..."
sleep 1
fi
done
if [ "$resource_available" = false ]; then
echo " ⚠️ Maksimal urinishlar tugadi!"
fi
echo
# 2. SERVICE STARTUP MONITORING
echo "=== 2. Xizmat Ishga Tushirish Monitoring ==="
# Database startup simulation
echo "Database startup kutish:"
db_ready=false
startup_time=0
max_wait=5
echo " 🗄️ Database ishga tushirilmoqda..."
until [ "$db_ready" = true ] || [ $startup_time -ge $max_wait ]; do
((startup_time++))
echo " ⏳ Kutilmoqda... ${startup_time}s"
if [ $startup_time -ge 2 ] && [ $((RANDOM % 10)) -gt 2 ]; then
db_ready=true
echo " ✅ Database tayyor! (${startup_time}s ichida)"
else
sleep 1
fi
done
if [ "$db_ready" = false ]; then
echo " ❌ Database startup timeout! (${max_wait}s)"
fi
echo
# Port availability check
echo "Port mavjudligi tekshiruvi:"
required_ports=(8080 3306 6379)
for port in "${required_ports[@]}"; do
echo " 🔌 Port $port tekshirilmoqda..."
port_available=false
check_attempts=0
max_attempts=3
until [ "$port_available" = true ] || [ $check_attempts -ge $max_attempts ]; do
((check_attempts++))
echo " Urinish #$check_attempts..."
if [ $((RANDOM % 10)) -gt 1 ]; then
port_available=true
echo " ✅ Port $port mavjud!"
else
echo " ❌ Port $port band, kutilmoqda..."
sleep 1
fi
done
if [ "$port_available" = false ]; then
echo " ⚠️ Port $port hali ham band!"
fi
done
echo
# 3. FILE PROCESSING UNTIL COMPLETE
echo "=== 3. Fayl Qayta Ishlash (Until Complete) ==="
# Batch file processor
echo "Batch fayl qayta ishlash:"
# Create sample files to process
mkdir -p processing_queue
for i in {1..5}; do
echo "Sample data $i" > "processing_queue/file_$i.txt"
done
echo " 📁 5 ta fayl yaratildi processing_queue/ da"
processed_count=0
total_files=$(find processing_queue -name "*.txt" | wc -l)
echo " ⚙️ Fayllarni qayta ishlash boshlanmoqda..."
until [ $processed_count -ge $total_files ]; do
# Find next file to process
next_file=$(find processing_queue -name "*.txt" | head -1)
if [ -n "$next_file" ]; then
((processed_count++))
filename=$(basename "$next_file")
echo " 📄 Qayta ishlanmoqda: $filename ($processed_count/$total_files)"
# Simulate processing time
sleep 0.5
# Move to processed folder
mkdir -p processed
mv "$next_file" "processed/"
echo " ✅ Tugallandi: $filename"
else
echo " ⚠️ Qayta ishlanadigan fayl topilmadi!"
break
fi
done
echo " 🎉 Barcha fayllar qayta ishlandi! ($processed_count ta)"
echo
# Cleanup
rm -rf processing_queue processed
# Download completion monitoring
echo "Yuklab olish tugallanishi:"
downloads=("system-update.deb" "backup-data.tar.gz")
for download in "${downloads[@]}"; do
echo " 📥 $download yuklab olish monitoring:"
download_complete=false
progress=0
target_size=$((RANDOM % 100 + 50))
until [ "$download_complete" = true ]; do
increment=$((RANDOM % 10 + 5))
progress=$((progress + increment))
if [ $progress -ge $target_size ]; then
progress=$target_size
download_complete=true
fi
percentage=$((progress * 100 / target_size))
printf " Progress: %3d%% (%d/%d MB)\r" $percentage $progress $target_size
if [ "$download_complete" = false ]; then
sleep 0.3
fi
done
echo
echo " ✅ $download muvaffaqiyatli yuklab olindi!"
echo
done
Loop Control
Nazariya
Loop control operatorlari tsikl oqimini boshqarish uchun ishlatiladi:
break- tsiklni butunlay to'xtatadicontinue- joriy iteratsiyani o'tkazib, keyingisiga o'tadibreak n- n ta ichki tsikldan chiqadicontinue n- n ta ichki tsiklda keyingi iteratsiyaga o'tadi
Amaliyot
#!/bin/bash
echo "============================================"
echo " LOOP CONTROL DEMO"
echo "============================================"
# 1. BASIC BREAK AND CONTINUE
echo "=== 1. Asosiy Break va Continue ==="
# Break example
echo "Break misoli (birinchi juft raqamni topganda to'xtash):"
echo -n " Raqamlar: "
for i in {1..10}; do
echo -n "$i "
if [ $((i % 2)) -eq 0 ]; then
echo
echo " ✅ Birinchi juft raqam topildi: $i"
echo " 🛑 Tsikl to'xtatildi"
break
fi
done
echo
# Continue example
echo "Continue misoli (faqat toq raqamlarni ko'rsatish):"
echo -n " Toq raqamlar: "
for i in {1..10}; do
if [ $((i % 2)) -eq 0 ]; then
continue # Skip even numbers
fi
echo -n "$i "
done
echo -e "\n"
# Practical search example
echo "Amaliy qidiruv misoli:"
users=("ahmad" "dilshod" "madina" "jasur" "zarina")
search_user="madina"
found=false
echo " 👤 Foydalanuvchi qidirilmoqda: $search_user"
for user in "${users[@]}"; do
echo " Tekshirilmoqda: $user"
if [ "$user" = "$search_user" ]; then
echo " ✅ Topildi: $user"
found=true
break
fi
done
if [ "$found" = false ]; then
echo " ❌ Topilmadi: $search_user"
fi
echo
# Skip processing certain items
echo "Ma'lum elementlarni o'tkazib yuborish:"
items=("item1" "SKIP" "item2" "ERROR" "item3" "item4")
echo " 📦 Elementlar qayta ishlanmoqda:"
processed=0
for item in "${items[@]}"; do
echo " 📄 Tekshirilmoqda: $item"
# Skip certain items
if [[ "$item" == "SKIP" || "$item" == "ERROR" ]]; then
echo " ⏭️ O'tkazib yuborildi: $item"
continue
fi
# Process normal item
echo " ✅ Qayta ishlandi: $item"
((processed++))
done
echo " 📊 Jami qayta ishlandi: $processed ta element"
echo
# 2. NESTED LOOP CONTROL
echo "=== 2. Ichma-ich Tsikl Boshqaruvi ==="
# Simple nested loops with break
echo "Oddiy ichma-ich tsikllar (break):"
echo " Ko'paytirish jadvalida 50 dan katta birinchi qiymatni topish:"
found_value=false
for i in {1..10}; do
echo -n " $i qatori: "
for j in {1..10}; do
product=$((i * j))
echo -n "$product "
if [ $product -gt 50 ]; then
echo
echo " ✅ 50 dan katta qiymat topildi: $i x $j = $product"
found_value=true
break 2 # Break from both loops
fi
done
if [ "$found_value" = true ]; then
break
fi
echo
done
echo
# Matrix processing with continue
echo "Matrix qayta ishlash (continue):"
echo " 3x3 matrix, diagonal elementlarni o'tkazib yuborish:"
for ((i=1; i<=3; i++)); do
echo -n " Qator $i: "
for ((j=1; j<=3; j++)); do
if [ $i -eq $j ]; then
echo -n "X " # Skip diagonal
continue
fi
echo -n "[$i,$j] "
done
echo
done
echo
# 3. ERROR HANDLING WITH LOOP CONTROL
echo "=== 3. Xato Bilan Ishlash (Loop Control) ==="
# File processing with error handling
echo "Fayl qayta ishlash (xato bilan ishlash):"
# Create test files (some will have "errors")
mkdir -p error_test
echo "valid data 1" > error_test/file1.txt
echo "ERROR: corrupted" > error_test/file2.txt
echo "valid data 2" > error_test/file3.txt
echo "" > error_test/file4.txt # Empty file
echo "valid data 3" > error_test/file5.txt
processed_count=0
error_count=0
max_errors=2
echo " 📁 Fayllar qayta ishlanmoqda..."
for file in error_test/*.txt; do
filename=$(basename "$file")
echo " 📄 Qayta ishlanmoqda: $filename"
# Check if file is empty
if [ ! -s "$file" ]; then
echo " ⚠️ Bo'sh fayl o'tkazib yuborildi"
continue
fi
# Check for error content
if grep -q "ERROR" "$file"; then
((error_count++))
echo " ❌ Xato topildi! ($error_count/$max_errors)"
if [ $error_count -ge $max_errors ]; then
echo " 🛑 Maksimal xato soni yetdi, to'xtatilmoqda!"
break
fi
continue
fi
# Process valid file
((processed_count++))
content=$(cat "$file")
echo " ✅ Muvaffaqiyatli: '$content'"
done
echo " 📊 Natijalar:"
echo " Qayta ishlandi: $processed_count ta fayl"
echo " Xatolar: $error_count ta"
echo
# Network retry mechanism
echo "Network retry mexanizmi:"
servers=("server1.com" "server2.com" "server3.com")
max_retries=3
successful_connections=0
for server in "${servers[@]}"; do
echo " 🌐 Ulanish: $server"
connected=false
retry_count=0
while [ $retry_count -lt $max_retries ]; do
((retry_count++))
echo " Urinish #$retry_count..."
# Simulate connection (60% success rate)
if [ $((RANDOM % 10)) -gt 3 ]; then
echo " ✅ Muvaffaqiyatli ulanish!"
connected=true
((successful_connections++))
break
else
echo " ❌ Ulanish muvaffaqiyatsiz"
if [ $retry_count -lt $max_retries ]; then
echo " ⏳ 1 soniya kutish..."
sleep 1
fi
fi
done
if [ "$connected" = false ]; then
echo " 💀 $server ga ulanib bo'lmadi ($max_retries urinish)"
fi
echo
done
echo " 📊 Ulanish natijalari:"
echo " Muvaffaqiyatli: $successful_connections/${#servers[@]}"
echo
# Cleanup
rm -rf error_test
# 4. ADVANCED CONTROL PATTERNS
echo "=== 4. Murakkab Control Naqshlari ==="
# State machine simulation
echo "State machine simulatsiyasi:"
states=("INIT" "LOADING" "READY" "PROCESSING" "ERROR" "SHUTDOWN")
current_state="INIT"
state_count=0
max_states=8
echo " 🔄 State machine ishga tushirilmoqda..."
while [ $state_count -lt $max_states ]; do
((state_count++))
echo " State #$state_count: $current_state"
case "$current_state" in
"INIT")
echo " 🏁 Tizim ishga tushirilmoqda..."
current_state="LOADING"
;;
"LOADING")
echo " 📥 Ma'lumotlar yuklanmoqda..."
# Simulate loading (80% success)
if [ $((RANDOM % 10)) -gt 1 ]; then
current_state="READY"
else
current_state="ERROR"
fi
;;
"READY")
echo " ✅ Tizim tayyor"
current_state="PROCESSING"
;;
"PROCESSING")
echo " ⚙️ Ma'lumotlar qayta ishlanmoqda..."
# Simulate processing (70% success)
if [ $((RANDOM % 10)) -gt 2 ]; then
current_state="READY"
else
current_state="ERROR"
fi
;;
"ERROR")
echo " ❌ Xato holati!"
echo " 🔧 Tizim tiklash..."
current_state="INIT"
;;
"SHUTDOWN")
echo " 🔴 Tizim o'chirilmoqda..."
break
;;
esac
# Random shutdown
if [ $state_count -gt 5 ] && [ $((RANDOM % 10)) -eq 0 ]; then
current_state="SHUTDOWN"
fi
sleep 0.3
done
echo " 🏁 State machine to'xtatildi: $current_state"
echo
# Load balancer simulation
echo "Load balancer simulatsiyasi:"
servers=("server1" "server2" "server3")
server_loads=(0 0 0) # Current load for each server
max_load=5
requests=12
echo " ⚖️ Load balancing ($requests ta request):"
for ((request=1; request<=requests; request++)); do
echo " Request #$request:"
assigned=false
# Try to assign to least loaded server
for ((i=0; i<${#servers[@]}; i++)); do
if [ ${server_loads[i]} -lt $max_load ]; then
echo " ➡️ ${servers[i]} ga tayinlandi (load: ${server_loads[i]}/$max_load)"
server_loads[i]=$((server_loads[i] + 1))
assigned=true
break
fi
done
if [ "$assigned" = false ]; then
echo " ❌ Barcha serverlar band! Request rad etildi."
continue
fi
# Randomly complete some requests
for ((i=0; i<${#servers[@]}; i++)); do
if [ ${server_loads[i]} -gt 0 ] && [ $((RANDOM % 3)) -eq 0 ]; then
server_loads[i]=$((server_loads[i] - 1))
echo " ✅ ${servers[i]} request tugalladi (load: ${server_loads[i]}/$max_load)"
fi
done
sleep 0.2
done
echo " 📊 Yakuniy server loadlari:"
for ((i=0; i<${#servers[@]}; i++)); do
echo " ${servers[i]}: ${server_loads[i]}/$max_load"
done
echo
# 5. DATA PROCESSING PIPELINE
echo "=== 5. Ma'lumot Qayta Ishlash Pipeline ==="
# Pipeline processor
echo "Pipeline qayta ishlash:"
pipeline_stages=("INPUT" "VALIDATE" "TRANSFORM" "OUTPUT")
items=("item1" "item2" "item3" "item4" "item5")
echo " 🏭 Pipeline qayta ishlash:"
for item in "${items[@]}"; do
echo " 📦 Processing: $item"
pipeline_failed=false
for stage in "${pipeline_stages[@]}"; do
echo " $stage stage..."
# Simulate stage processing
case "$stage" in
"INPUT")
echo " 📥 Ma'lumot qabul qilindi"
;;
"VALIDATE")
# 10% validation failure
if [ $((RANDOM % 10)) -eq 0 ]; then
echo " ❌ Validatsiya muvaffaqiyatsiz!"
pipeline_failed=true
break
else
echo " ✅ Validatsiya muvaffaqiyatli"
fi
;;
"TRANSFORM")
# 5% transformation failure
if [ $((RANDOM % 20)) -eq 0 ]; then
echo " ❌ Transformatsiya muvaffaqiyatsiz!"
pipeline_failed=true
break
else
echo " 🔄 Ma'lumot transformatsiya qilindi"
fi
;;
"OUTPUT")
echo " 📤 Ma'lumot chiqarildi"
;;
esac
sleep 0.1
done
if [ "$pipeline_failed" = true ]; then
echo " 💀 $item pipeline muvaffaqiyatsiz!"
else
echo " 🎉 $item muvaffaqiyatli qayta ishlandi!"
fi
echo
done
# 6. COMPREHENSIVE EXAMPLE
echo "=== 6. Keng Qamrovli Misol ==="
# Log analyzer with all loop types
echo "Log analyzer (barcha tsikl turlari bilan):"
# Create sample log file
cat > comprehensive.log << 'EOF'
2024-06-24 10:15:23 INFO User login: admin
2024-06-24 10:16:45 ERROR Database connection failed
2024-06-24 10:17:12 INFO User login: user123
2024-06-24 10:18:33 WARN Memory usage high: 85%
2024-06-24 10:19:44 INFO File uploaded: document.pdf
2024-06-24 10:20:15 ERROR File not found: missing.txt
2024-06-24 10:21:26 INFO User logout: admin
2024-06-24 10:22:37 WARN Disk space low: 5GB remaining
2024-06-24 10:23:45 ERROR Authentication failed
2024-06-24 10:24:12 INFO Backup completed
EOF
echo " 📝 Log fayl yaratildi: comprehensive.log"
# Analyze log levels with for loop
echo " 📊 Log level statistikasi (for loop):"
declare -A log_counts
log_counts[INFO]=0
log_counts[ERROR]=0
log_counts[WARN]=0
for level in INFO ERROR WARN; do
count=$(grep -c "$level" comprehensive.log)
log_counts[$level]=$count
echo " $level: $count ta"
done
echo
# Find critical errors with while loop
echo " 🚨 Kritik xatolar (while loop):"
while IFS= read -r line; do
if [[ "$line" =~ ERROR ]]; then
timestamp=$(echo "$line" | cut -d' ' -f1-2)
message=$(echo "$line" | cut -d' ' -f4-)
echo " [$timestamp] $message"
fi
done < comprehensive.log
echo
# Monitor for new entries with until loop
echo " 👀 Yangi log entry kutish (until simulation):"
original_size=$(wc -l < comprehensive.log)
new_entries_found=false
wait_time=0
# Simulate adding new log entry
(sleep 2 && echo "2024-06-24 10:25:00 INFO New entry added" >> comprehensive.log) &
until [ "$new_entries_found" = true ] || [ $wait_time -ge 5 ]; do
((wait_time++))
current_size=$(wc -l < comprehensive.log)
if [ $current_size -gt $original_size ]; then
new_entries_found=true
echo " ✅ Yangi entry topildi!"
tail -1 comprehensive.log | while read -r new_line; do
echo " 📄 $new_line"
done
else
echo " ⏳ Kutilmoqda... ${wait_time}s"
sleep 1
fi
done
if [ "$new_entries_found" = false ]; then
echo " ⚠️ Yangi entry topilmadi"
fi
# Cleanup
rm -f comprehensive.log
echo
echo "============================================"
echo " BARCHA TSIKL TURLARI TUGADI"
echo "============================================"